﻿// Inner Fire 游戏引擎库
// Prefab - 用于载入一个对象设定
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：框架层(5)
// 用于预置对象的设置。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-04-21

#include "prefab.h"
#include <enum_parser.h>
#include <graphics/imath.h>

namespace ifire::game {

Prefab::Prefab(ConfigManager* manager, const ikit::XmlNode& node)
    : ConfigInfo(manager, node("Name"))
    , type(ParsePrefabType(node("Type")))
    , render_layer(dx::RenderItem::GetRenderLayer(node("RenderLayer")))
    , position(node("Position"))
    , rotation(node("Rotation"))
    , rotation_quat(imath::EulerToQuaternion(rotation))
    , scale(node("Scale", XMFLOAT3(1.0f, 1.0f, 1.0f)))
    , tiling(node("Tiling", XMFLOAT2(1.0f, 1.0f)))
    , model(node("Model"))
    , material(node("Material"))
    , is_cast_shadow(node("CastShadow", true)) {
  if (type == PrefabType::Map){
    map_name = node("Map");
  }
}

PrefabType ParsePrefabType(ikit::sstr text) {
  const static std::pair<ikit::sstr, PrefabType> enums[] = {
      {"Mesh", PrefabType::Mesh},         //
      {"SkinMesh", PrefabType::SkinMesh}, //
      {"Camera", PrefabType::Camera},     //
      {"Water", PrefabType::Water},       //
      {"Map", PrefabType::Map},       //
      {"SkyBox", PrefabType::SkyBox} //(这个放在最后面，因为要计算数量）
  };
  static ikit::EnumParser<PrefabType> parser(
      enums, (int)PrefabType::SkyBox + 1);
  return parser.Get(text, PrefabType::Mesh);
}

} // namespace ifire::game